package modelovectorial.core;

import modelovectorial.DocumentoPDF;
import modelovectorial.persistencia.SuggestResultDB;
import soporte.web.Pagination;
import utn.frc.tsb.utils.ValerioFritelli.HashTable.HashTable;
import utn.frc.tsb.utils.ValerioFritelli.SimpleList.SimpleList;
import utn.frc.tsb.utils.ValerioFritelli.SortMethods.Ordenamiento;

/**
 * @project DLC Final / UTN FRC 2013
 * @date Febrero de 2013
 *
 * @author Gonzalo Arribere
 * @author Gustavo Morales
 * @author Pablo Moreno
 *
 * Esta clase representa las sugerencias realizadas al usuario por el motor para
 * que realice su consulta.
 */
public class SuggestResult {

    // La cantidad de distintas sugerencias a mostrar en el buscador, segun el modelo vectorial
    public static final int MAX_SUGGEST = 5;
    // Arreglo que contienen las sugerencias a ofrecer
    private DocumentoPDF mDocuments[];
    // Cantidad de sugerencias generadas a partir de la semiconsulta del usuario
    private int mResultSize;

    /**
     * Constructor por parametros de la clase que inicializa sus atributos.
     *
     * @param pQuery
     */
    public SuggestResult(SimpleList pQuery) {
        if (pQuery.size() >= 2) {
            mDocuments = SuggestResultDB.executeQuerySingle(pQuery);
            mResultSize = mDocuments.length;
            System.out.println("docs found: " + mResultSize);
        } else {
            mDocuments = new DocumentoPDF[0];
            mResultSize = 0;
        }
    }

    /**
     * Devuelve la cantidad de sugerencias generadas.
     *
     * @return entero con la cantidad de sugerencias generadas.
     */
    public int results() {
        return mResultSize;
    }

    public DocumentoPDF getDocumentAt(int pIndex) {
        return mDocuments[pIndex];
    }

    /**
     * Obtiene las sugerencias, calcula su relevancia y las ordena usando
     * quickSort.
     */
    public void compute() {
        int totalDocuments = DocumentoPDF.getTotalDocuments();

        int len = mDocuments.length;

        for (int i = 0; i < len; i++) {
            mDocuments[i].computeTFIDF(totalDocuments);
        }
        Ordenamiento.quickSort(mDocuments);
    }

    /**
     * Llena el arreglo de documentos con las sugerencias obtenidas
     */
    public void fillDocuments() {
        Pagination pPagination = new Pagination(0, MAX_SUGGEST);

        pPagination.fixEndIndex(mDocuments.length);
        HashTable documents = DocumentoPDF.getDocuments(mDocuments, pPagination);

        for (int i = 0; i < mResultSize; i++) {
            mDocuments[i].copy((DocumentoPDF) documents.get(mDocuments[i]), true);
            mDocuments[i].fillTerms(false);
        }
    }

    public DocumentoPDF[] getDocuments() {
        return mDocuments;
    }
}